package com.tanhua.server.service;

import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.mongo.Publish;
import com.tanhua.domain.vo.CommentVo;
import com.tanhua.domain.vo.PageResult;
import com.tanhua.dubbo.api.CommentApi;
import com.tanhua.dubbo.api.PublishApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.api.UserStatusApi;
import com.tanhua.server.interceptor.UserHolder;
import com.tanhua.server.utils.TimeUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommentService {

    @Reference
    private CommentApi commentApi;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Reference
    private UserInfoApi userInfoApi;

    @Reference
    private UserStatusApi userStatusApi;

    @Reference
    private PublishApi publishApi;

    @Autowired
    private MovementsMQService movementsMQService;

    private final String FREEZE_KEY = "FREEZE_KEY_"; // 定义账号状态的前缀


    /**
     * 动态-点赞
     */
    public ResponseEntity<Object> likeComment(String id) {
        // 1.创建评论对象
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(id)); // 动态id
        comment.setCommentType(1);  // 评论类型：1-点赞，2-评论，3-喜欢
        comment.setPubType(1); // 评论内容类型：1-对动态操作 2-对视频操作 3-对评论操作
        comment.setUserId(UserHolder.getUserId());
        comment.setCreated(System.currentTimeMillis());
        // 根据动态id查询动态信息
        Publish publish = publishApi.findById(id);
        // 设置动态发布者的id
        comment.setPublishUserId(publish.getUserId());

        // 2.调用服务提供者保存评论数据、修改动态表点赞数量、返回点赞数量
        long count = commentApi.save(comment);

        // 3.往redis存入一个点赞标记，key必须唯一：userId + publishId
        String key = "public_like_comment_" + UserHolder.getUserId() + "_" + id;
        redisTemplate.opsForValue().set(key, "xxx");

        // 4.发送评分数据消息到RocketMQ
        movementsMQService.sendMsg(id, 3);

        return ResponseEntity.ok(count);
    }

    /**
     * 接口名称：动态-取消点赞
     */
    public ResponseEntity<Object> dislikeComment(String id) {
        // 1.创建评论对象，删除的条件
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(id)); // 动态id
        comment.setCommentType(1);  // 评论类型：1-点赞，2-评论，3-喜欢
        comment.setUserId(UserHolder.getUserId());

        // 2.调用服务提供者删除评论数据、修改动态表点赞数量、返回点赞数量
        long count = commentApi.delete(comment);

        // 3.删除redis点赞标记，key必须唯一：userId + publishId
        String key = "public_like_comment_" + UserHolder.getUserId() + "_" + id;
        redisTemplate.delete(key);

        return ResponseEntity.ok(count);
    }

    /**
     * 动态-喜欢
     */
    public ResponseEntity<Object> loveComment(String id) {
        // 1.创建评论对象
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(id)); // 动态id
        comment.setCommentType(3);  // 评论类型：1-点赞，2-评论，3-喜欢
        comment.setPubType(1); // 评论内容类型：1-对动态操作 2-对视频操作 3-对评论操作
        comment.setUserId(UserHolder.getUserId());
        comment.setCreated(System.currentTimeMillis());
        // 根据动态id查询动态信息
        Publish publish = publishApi.findById(id);
        // 设置动态发布者的id
        comment.setPublishUserId(publish.getUserId());

        // 2.调用服务提供者保存评论数据、修改动态表喜欢数量、返回喜欢数量
        long count = commentApi.save(comment);

        // 3.往redis存入一个喜欢标记，key必须唯一：userId + publishId
        String key = "public_love_comment_" + UserHolder.getUserId() + "_" + id;
        redisTemplate.opsForValue().set(key, "xxx");

        return ResponseEntity.ok(count);
    }

    /**
     * 动态-取消喜欢
     */
    public ResponseEntity<Object> unloveComment(String id) {
        // 1.创建评论对象，删除的条件
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(id)); // 动态id
        comment.setCommentType(3);  // 评论类型：1-点赞，2-评论，3-喜欢
        comment.setUserId(UserHolder.getUserId());

        // 2.调用服务提供者删除评论数据、修改动态表喜欢数量、返回喜欢数量
        long count = commentApi.delete(comment);

        // 3.删除redis喜欢标记，key必须唯一：userId + publishId
        String key = "public_love_comment_" + UserHolder.getUserId() + "_" + id;
        redisTemplate.delete(key);

        return ResponseEntity.ok(count);
    }

    /**
     * 评论列表
     */
    public ResponseEntity<Object> queryCommentsList(String movementId, Integer page, Integer pagesize) {
        // 1.调用服务提供者api，根据动态id查询评论列表，并分页
        PageResult pageResult = commentApi.queryCommentsList(movementId, page, pagesize);

        // 获取当前页的数据
        List<Comment> commentList = (List<Comment>) pageResult.getItems();

        // 2.封装返回数据
        List<CommentVo> voList = new ArrayList<>();
        if (commentList != null && commentList.size() > 0) {
            for (Comment comment : commentList) {
                // 2.1 创建vo
                CommentVo vo = new CommentVo();

                // 2.2 封装vo
                vo.setId(comment.getId().toString());

                // 查询评论人的详情
                UserInfo userInfo = userInfoApi.findById(comment.getUserId());
                vo.setAvatar(userInfo.getAvatar());
                vo.setNickname(userInfo.getNickname());

                vo.setContent(comment.getContent());
                // 日期格式化
                vo.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(comment.getCreated())));
                vo.setLikeCount(comment.getLikeCount());
                vo.setHasLiked(0);

                // 2.3 添加vo到集合
                voList.add(vo);
            }
        }

        // 3.重新设置items的值
        pageResult.setItems(voList);

        return ResponseEntity.ok(pageResult);
    }

    /**
     * 评论-提交
     */
    public ResponseEntity<Object> saveComments(String movementId, String content) {
        Long userId = UserHolder.getUserId(); // 获取用户ID
        // 判断用户是否被禁言
        String status = redisTemplate.opsForValue().get(FREEZE_KEY + userId);

        // 如果用户没有被禁言，在查询用户信息是否是冻结状态
        UserInfo userInfo = userInfoApi.findById(userId);
        if (userInfo.getUserStatus().equals("2") && status == null) {
            userInfo.setUserStatus("1");
            userInfoApi.update(userInfo);
            userStatusApi.updateStatus(userId);
        } else if ("2".equals(status)) {// 账号被禁言
            Long expire = redisTemplate.getExpire(FREEZE_KEY + userId);
            String second = TimeUtils.second(expire);
            return ResponseEntity.status(500).body("该账号已被禁言\n解封时间：" + second);
        }


        // 1.创建评论对象
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(movementId)); // 动态id
        comment.setCommentType(2);  // 评论类型：1-点赞，2-评论，3-喜欢
        comment.setPubType(1); // 评论内容类型：1-对动态操作 2-对视频操作 3-对评论操作
        comment.setContent(content); // 评论内容
        comment.setUserId(userId);
        comment.setCreated(System.currentTimeMillis());
        // 根据动态id查询动态信息
        Publish publish = publishApi.findById(movementId);
        // 设置动态发布者的id
        comment.setPublishUserId(publish.getUserId());

        // 2.调用服务提供者保存评论数据、修改动态表评论数量
        commentApi.save(comment);

        return ResponseEntity.ok(null);
    }
}
